package com.agile.springboot.controller;

import com.agile.springboot.common.Result;
import com.agile.springboot.entity.Sms;
import com.agile.springboot.service.SmsService;
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import org.json.JSONException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;

@RestController
@RequestMapping("/sms")
public class SmsController {

    @Resource
    SmsService smsService;

    /**
     * 通过用户手机号发送短信
     * @param sms 短信实体
     * 所必须的参数为 username 用户名属性和 phone 用户手机号属性
     * @return 结果相关信息
     */
    @PostMapping("/sendVerificationCode")
    public Result<?> sendVerificationCode(@RequestBody Sms sms){
        int templateId = 1590912;////腾讯云短信服务中短信模板Id
        int appId =1400757418;//腾讯云短信服务中所管理应用的SDK AppId
        String smsSign = "九人开发公众号";//腾讯云短信服务中签名内容
        String appKey = "fd33f067670bbd7f2659d69a53a84b76";//腾讯云短信服务中所管理应用的App Key
        try{
            Date startDate = new Date();
            Date endDate = new Date(startDate.getTime() + 600000);//发送短信的时刻加上验证码有效时长10分钟
            sms.setVerify_code(""+Math.round((Math.random()+1) * 1000));//随机生成四位数验证码
            sms.setValid_time(10);//手机验证码有效时长
            sms.setStart_time(startDate);//验证码效力开始时间
            sms.setEnd_time(endDate);//验证码效力结束时间
            String[] params = {sms.getVerify_code(),Integer.toString(sms.getValid_time())};
            SmsSingleSender sender = new SmsSingleSender(appId,appKey);
            SmsSingleSenderResult result = sender.sendWithParam("86",sms.getPhone(),templateId,params,smsSign,"","");
            if(result.result==0){
                smsService.saveSms(sms);//将所发短信相关信息存入数据库，用于和用户所输入的短信验证码进行比较
                return Result.success(result,"发送短信成功！");
            }else if(result.result==1004){
                return Result.error("1004","发送验证码失败，无效手机号！");
            }
        }catch (HTTPException e){
            e.printStackTrace();
        }catch (JSONException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        return Result.error("1004","发送验证码失败，无效手机号！");
    }

    /**
     * 验证所输入的短信验证码是否正确
     * @param sms 短息实体
     * 所必须的参数为 username 用户名属性、 phone 用户手机号属性、 verify_code 短信验证码属性
     * @return 结果相关信息
     */
    @PostMapping("/verifyInformation")
    public Result<?> verifyInformation(@RequestBody Sms sms){
        Sms result = smsService.verifyInformation(sms);//获取查找到的短信相关信息
        if(result!=null){
            Date nowDate = new Date();
            if(nowDate.compareTo(result.getEnd_time())==1){
                smsService.deleteSms(result.getId(),false);//将已失效的短信相关信息删除
                return Result.error("-1","验证码已失效!");
            }else{
                smsService.deleteSms(result.getId(),true);//验证成功后，将此短信相关信息删除
                return Result.success(result,"验证成功！");
            }
        }
        return Result.error("-1","验证码错误!");
    }
}
